﻿using GDM.Hogar.Entidades;
using GDM.Hogar.Entidades.Enums;
using GDM.Hogar.Managers.Contratos;
using GDM.Hogar.Soporte.Helpers;
using System;
using System.Linq;
using System.Windows.Forms;

namespace GDM.Hogar.Aplicacion.Formularios.Mercaderia
{
    public partial class FrmConsultaRemitos
#if DEBUG
 : FrmConsultaRemito
#else
         : FrmConsulta<ConsultaRemito>
#endif
    {
        private readonly IRemitoManager _remitoManager;
        private readonly IProveedorManager _proveedorManager;
        private FrmRemito _frmCrearRemito;
        private FrmRemito _frmEditarRemito;

        private bool EsCoordinador
        {
            get { return ContextoUsuario.RolId == (int)Rol.Coordinador; }
        }

        #region Public Methods

        public FrmConsultaRemitos(IRemitoManager remitoManager, IProveedorManager proveedorManager)
        {
            if (remitoManager == null)
                throw new ArgumentNullException("remitoManager");
            if (proveedorManager == null)
                throw new ArgumentNullException("proveedorManager");

            _remitoManager = remitoManager;
            _proveedorManager = proveedorManager;
            InitializeComponent();
        }

        #endregion Public Methods

        #region Private Methods

        protected override void CrearRegistro()
        {
            var delFrmCerrado = new FormClosedEventHandler(NuevoRemitoFrmClosed);
            _frmCrearRemito = AbrirFormularioModal(_frmCrearRemito, delFrmCerrado);
        }

        protected override void EditarRegistro(ConsultaRemito remito)
        {
            var delFrmCerrado = new FormClosedEventHandler(EditarRemitoFrmClosed);
            _frmEditarRemito = AbrirFormularioModal(_frmEditarRemito, delFrmCerrado, f => f.Remito = remito);
        }

        private void btnBuscar_Click(object sender, EventArgs e)
        {
            dgRemitos.Search(Datos.AsQueryable(), CriterioDeBusqueda);
        }

        private void btnQuitarFiltro_Click(object sender, EventArgs e)
        {
            LimpiarControl(gbFiltros);
            btnBuscar_Click(null, null);
        }

        private void CargarProveedores()
        {
            cmbProveedores.CargarItems(_proveedorManager.ObtenerProveedores(), "Nombre", "ProveedorId", true);
        }

        private void CargarRemitos()
        {
            Datos = _remitoManager.ObtenerRemitos().ToList();
            InicializarGrilla(dgRemitos);
        }

        private void EditarRemitoFrmClosed(object sender, FormClosedEventArgs e)
        {
            var frm = sender as FrmRemito;
            if (frm != null && frm.RefrescarCambios)
            {
                RefrescarGrilla();
            }
            CargarProveedores();
        }

        private void NuevoRemitoFrmClosed(object sender, FormClosedEventArgs e)
        {
            var frm = sender as FrmRemito;
            if (frm != null && frm.RefrescarCambios)
            {
                RefrescarGrilla();
            }
            CargarProveedores();
        }

        private bool CriterioDeBusqueda(ConsultaRemito remito)
        {
            var criterio = true;
            if (!txtNroRemito.Text.EsVacio()) criterio = remito.NumeroRemito.Contiene(txtNroRemito.Text);
            if (cmbProveedores.SelectedIndex > 0)
            {
                criterio = criterio && remito.ProveedorId == ((Proveedor)cmbProveedores.SelectedItem).ProveedorId;
            }

            return criterio;
        }

        private void FrmConsultaRemitos_Load(object sender, EventArgs e)
        {
            dgRemitos.UserCanAdd = EsCoordinador;
            dgRemitos.UserCanDelete = false;
            CargarProveedores();
            CargarRemitos();
            txtNroRemito.Focus();
            ttInfo.SetToolTip(btnQuitarFiltro, "Quitar filtro");
        }

        private void RefrescarGrilla()
        {
            Datos = _remitoManager.ObtenerRemitos();
            btnBuscar_Click(null, null);
        }

        #endregion Private Methods
    }
}